package com.atguigu.gulimall.auth.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.atguigu.common.constant.AuthServiceConstant;
import com.atguigu.common.utils.R;
import com.atguigu.gulimall.auth.feign.MemberFeignService;
import com.atguigu.common.vo.MemberVo;
import com.atguigu.gulimall.auth.vo.SocialUserVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * @ClassName OAuth2Controller
 * @Description TODO
 * @Detail 获取授权码，并并进行登录处理
 * @Author MyPC
 * @Date 2020/7/12
 * @Version 1.0
 */
@Slf4j
@Controller
public class OAuth2Controller {

    @Autowired
    MemberFeignService memberFeignService;

    @GetMapping("/auth/weibo/success")
    public String oauth(@RequestParam("code") String code, HttpSession session){
//        //1、使用code换取授权码,使用RestTemplate客户端去请求微博接口
        RestTemplate restTemplate = new RestTemplate();
        //请求路径
        String url="https://api.weibo.com/oauth2/access_token";
        //使用RestTemplate客户端时，必须使用MultiValueMap来封装对象，不能使用HashMap，否则封装不上
        MultiValueMap<String,String> requestBody=new LinkedMultiValueMap<String, String>();
        //封装请求体参数
        requestBody.add("client_id","1407685756");
        requestBody.add("client_secret","bb4d35bc2a13e5da5a3ec062d7c82358");
        requestBody.add("grant_type","authorization_code");
        requestBody.add("redirect_uri","http://auth.gulimall.com/auth/weibo/success");
        requestBody.add("code",code);
        HttpEntity<MultiValueMap<String,String>> stringHttpEntity = new HttpEntity<>(requestBody, null);
        ResponseEntity<Map> responseEntity = restTemplate.postForEntity(url, stringHttpEntity, Map.class);
        if(responseEntity.getStatusCodeValue() == 200){
            //获取授权码成功，进行下一步处理
            //获取授权码信息
            Map body = responseEntity.getBody();
            String string = JSON.toJSONString(body);
            //将授权码信息转成，将Json字符串转成SocialUserVo对象
            SocialUserVo socialUserVo = JSON.parseObject(string, SocialUserVo.class);
            //请求会员服务，进行注册或登录，如果是第一次使用社交登录，则先进行注册(为当前社交用户关联一个会员账号，如关联社交账号的uid)，否则，直接登录
            R login = memberFeignService.login(socialUserVo);
            if(login.getCode() == 0){
                //登录或注册成功
                //获取用户信息
                MemberVo data = login.getData("data", new TypeReference<MemberVo>() {
                });
                log.info("用户信息：{}",data);
                //TODO 1、解决不同域的session共享问题
                //TODO 2、不要使用java的序列化机制存储数据到redis这样每个存储在redis的对象都有实现序列化接口，而且不通用
                //session存储用户信息,整合了SpringSession和redis后后，会自动帮我们存在redis中
                session.setAttribute(AuthServiceConstant.SESSION_USER_NAME,data);
                //跳转到首页
                return "redirect:http://gulimall.com";
            }else {
                //否则，跳转到登录页面
                return "redirect:http://auth.gulimall.com/login.html";
            }
        }else {
            //否则，跳转到登录页面
            return "redirect:http://auth.gulimall.com/login.html";
        }
    }
}
